
<!doctype html>
<html lang="en" class="no-js">
  <head>
    
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width,initial-scale=1">
      
      
      
      
        <link rel="prev" href="..">
      
      
        <link rel="next" href="../Environment-Variables/">
      
      <link rel="icon" href="../assets/images/favicon.png">
      <meta name="generator" content="mkdocs-1.4.2, mkdocs-material-9.0.8">
    
    
      
        <title>Getting the image - Kartoza/docker-geoserver Documentation</title>
      
    
    
      <link rel="stylesheet" href="../assets/stylesheets/main.0d440cfe.min.css">
      
        
        <link rel="stylesheet" href="../assets/stylesheets/palette.2505c338.min.css">
      
      

    
    
    
      
        
        
        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
        <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
        <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
      
    
    
    <script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
    
      

    
    
    
  </head>
  
  
    
    
    
    
    
    <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="brown" data-md-color-accent="yellow">
  
    
    
    <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
    <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
    <label class="md-overlay" for="__drawer"></label>
    <div data-md-component="skip">
      
        
        <a href="#getting-the-image" class="md-skip">
          Skip to content
        </a>
      
    </div>
    <div data-md-component="announce">
      
    </div>
    
    
      

<header class="md-header" data-md-component="header">
  <nav class="md-header__inner md-grid" aria-label="Header">
    <a href=".." title="Kartoza/docker-geoserver Documentation" class="md-header__button md-logo" aria-label="Kartoza/docker-geoserver Documentation" data-md-component="logo">
      
  
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>

    </a>
    <label class="md-header__button md-icon" for="__drawer">
      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
    </label>
    <div class="md-header__title" data-md-component="header-title">
      <div class="md-header__ellipsis">
        <div class="md-header__topic">
          <span class="md-ellipsis">
            Kartoza/docker-geoserver Documentation
          </span>
        </div>
        <div class="md-header__topic" data-md-component="header-topic">
          <span class="md-ellipsis">
            
              Getting the image
            
          </span>
        </div>
      </div>
    </div>
    
    
    
      <label class="md-header__button md-icon" for="__search">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
      </label>
      <div class="md-search" data-md-component="search" role="dialog">
  <label class="md-search__overlay" for="__search"></label>
  <div class="md-search__inner" role="search">
    <form class="md-search__form" name="search">
      <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
      <label class="md-search__icon md-icon" for="__search">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
      </label>
      <nav class="md-search__options" aria-label="Search">
        
        <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
        </button>
      </nav>
      
    </form>
    <div class="md-search__output">
      <div class="md-search__scrollwrap" data-md-scrollfix>
        <div class="md-search-result" data-md-component="search-result">
          <div class="md-search-result__meta">
            Initializing search
          </div>
          <ol class="md-search-result__list" role="presentation"></ol>
        </div>
      </div>
    </div>
  </div>
</div>
    
    
      <div class="md-header__source">
        <a href="https://github.com/kartoza/docker-geoserver" title="Go to repository" class="md-source" data-md-component="source">
  <div class="md-source__icon md-icon">
    
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
  </div>
  <div class="md-source__repository">
    GitHub
  </div>
</a>
      </div>
    
  </nav>
  
</header>
    
    <div class="md-container" data-md-component="container">
      
      
        
          
        
      
      <main class="md-main" data-md-component="main">
        <div class="md-main__inner md-grid">
          
            
              
              <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
                <div class="md-sidebar__scrollwrap">
                  <div class="md-sidebar__inner">
                    


<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
  <label class="md-nav__title" for="__drawer">
    <a href=".." title="Kartoza/docker-geoserver Documentation" class="md-nav__button md-logo" aria-label="Kartoza/docker-geoserver Documentation" data-md-component="logo">
      
  
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>

    </a>
    Kartoza/docker-geoserver Documentation
  </label>
  
    <div class="md-nav__source">
      <a href="https://github.com/kartoza/docker-geoserver" title="Go to repository" class="md-source" data-md-component="source">
  <div class="md-source__icon md-icon">
    
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
  </div>
  <div class="md-source__repository">
    GitHub
  </div>
</a>
    </div>
  
  <ul class="md-nav__list" data-md-scrollfix>
    
      
      
      

  
  
  
    <li class="md-nav__item">
      <a href=".." class="md-nav__link">
        Kartoza/docker-geoserver
      </a>
    </li>
  

    
      
      
      

  
  
    
  
  
    <li class="md-nav__item md-nav__item--active">
      
      <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
      
      
        
      
      
        <label class="md-nav__link md-nav__link--active" for="__toc">
          Getting the image
          <span class="md-nav__icon md-icon"></span>
        </label>
      
      <a href="./" class="md-nav__link md-nav__link--active">
        Getting the image
      </a>
      
        

<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
  
  
  
    
  
  
    <label class="md-nav__title" for="__toc">
      <span class="md-nav__icon md-icon"></span>
      Table of contents
    </label>
    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
      
        <li class="md-nav__item">
  <a href="#pulling-from-dockerhub" class="md-nav__link">
    Pulling from Dockerhub
  </a>
  
</li>
      
        <li class="md-nav__item">
  <a href="#building-the-image" class="md-nav__link">
    Building the image
  </a>
  
</li>
      
        <li class="md-nav__item">
  <a href="#local-build-using-repository-checkout" class="md-nav__link">
    Local build using repository checkout
  </a>
  
</li>
      
        <li class="md-nav__item">
  <a href="#building-with-a-specific-version-of-tomcat" class="md-nav__link">
    Building with a specific version of  Tomcat
  </a>
  
</li>
      
        <li class="md-nav__item">
  <a href="#building-on-windows" class="md-nav__link">
    Building on Windows
  </a>
  
</li>
      
    </ul>
  
</nav>
      
    </li>
  

    
      
      
      

  
  
  
    <li class="md-nav__item">
      <a href="../Environment-Variables/" class="md-nav__link">
        Environment Variables
      </a>
    </li>
  

    
      
      
      

  
  
  
    <li class="md-nav__item">
      <a href="../Mounting-Configs/" class="md-nav__link">
        Mounting Configs
      </a>
    </li>
  

    
      
      
      

  
  
  
    <li class="md-nav__item">
      <a href="../Running-the-Image/" class="md-nav__link">
        Running the Image
      </a>
    </li>
  

    
      
      
      

  
  
  
    <li class="md-nav__item">
      <a href="../Kubernetes/" class="md-nav__link">
        Kubernetes
      </a>
    </li>
  

    
      
      
      

  
  
  
    <li class="md-nav__item">
      <a href="../Support-and-credits/" class="md-nav__link">
        Support and credits
      </a>
    </li>
  

    
  </ul>
</nav>
                  </div>
                </div>
              </div>
            
            
              
              <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
                <div class="md-sidebar__scrollwrap">
                  <div class="md-sidebar__inner">
                    

<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
  
  
  
    
  
  
    <label class="md-nav__title" for="__toc">
      <span class="md-nav__icon md-icon"></span>
      Table of contents
    </label>
    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
      
        <li class="md-nav__item">
  <a href="#pulling-from-dockerhub" class="md-nav__link">
    Pulling from Dockerhub
  </a>
  
</li>
      
        <li class="md-nav__item">
  <a href="#building-the-image" class="md-nav__link">
    Building the image
  </a>
  
</li>
      
        <li class="md-nav__item">
  <a href="#local-build-using-repository-checkout" class="md-nav__link">
    Local build using repository checkout
  </a>
  
</li>
      
        <li class="md-nav__item">
  <a href="#building-with-a-specific-version-of-tomcat" class="md-nav__link">
    Building with a specific version of  Tomcat
  </a>
  
</li>
      
        <li class="md-nav__item">
  <a href="#building-on-windows" class="md-nav__link">
    Building on Windows
  </a>
  
</li>
      
    </ul>
  
</nav>
                  </div>
                </div>
              </div>
            
          
          
            <div class="md-content" data-md-component="content">
              <article class="md-content__inner md-typeset">
                
                  

  
  



<h1 id="getting-the-image">Getting the image</h1>
<p>There are various ways to get the image onto your system:</p>
<ul>
<li>Pulling from Dockerhub</li>
<li>Local build using docker-compose</li>
</ul>
<h3 id="pulling-from-dockerhub">Pulling from Dockerhub</h3>
<p>The preferred way (but using most bandwidth for the initial image) is to
get our docker trusted build like this:</p>
<pre><code class="language-shell">VERSION=2.22.0
docker pull kartoza/geoserver:$VERSION
</code></pre>
<h3 id="building-the-image">Building the image</h3>
<h3 id="local-build-using-repository-checkout">Local build using repository checkout</h3>
<p>To build yourself with a local checkout using the docker-compose.build.yaml:</p>
<ol>
<li>Clone the GitHub repository:</li>
</ol>
<pre><code>   git clone https://github.com/kartoza/docker-geoserver
</code></pre>
<ol>
<li>Edit the <a href="https://github.com/kartoza/docker-geoserver/blob/master/.env">.env</a> to change the build arguments:</li>
</ol>
<pre><code>   IMAGE_VERSION=[dockerhub tomcat](https://hub.docker.com/_/tomcat/)
   JAVA_HOME= java home path corresponding to the tomcat version
   WAR_URL= Default URL to fetch GeoServer war or zip file
   STABLE_PLUGIN_URL= URL to fetch GeoServer plugins
   DOWNLOAD_ALL_STABLE_EXTENSIONS= Specifies whether to download all stable plugins or a single one
   DOWNLOAD_ALL_COMMUNITY_EXTENSIONS=Specifies whether to download all community plugins or a single one
   GEOSERVER_UID=Specifies the uid to use for the user used to run GeoServer in the container
   GEOSERVER_GID=Specifies the gid to use for the group used to run GeoServer in the container
</code></pre>
<ol>
<li>Build the container and spin up the services</li>
</ol>
<pre><code>   cd docker-geoserver
   docker-compose -f docker-compose-build.yml up -d --build
</code></pre>
<h3 id="building-with-a-specific-version-of-tomcat">Building with a specific version of  Tomcat</h3>
<p>To build using a specific tagged release for tomcat image set the
<code>IMAGE_VERSION</code> build-arg to <code>8-jre8</code>: See the <a href="https://hub.docker.com/_/tomcat/">dockerhub tomcat</a>
to choose which tag you need to build against.</p>
<pre><code>ie VERSION=2.22.0
docker build --build-arg IMAGE_VERSION=8-jre8 --build-arg GS_VERSION=2.22.0 -t kartoza/geoserver:${VERSION} .
</code></pre>
<p>For some recent builds it is necessary to set the JAVA_PATH as well (e.g. Apache Tomcat/9.0.36)</p>
<pre><code>docker build --build-arg IMAGE_VERSION=9-jdk11-openjdk-slim --build-arg JAVA_HOME=/usr/local/openjdk-11/bin/java --build-arg GS_VERSION=2.22.0 -t kartoza/geoserver:2.22.0 .
</code></pre>
<p><strong>Note:</strong> Please check the <a href="https://docs.geoserver.org/stable/en/user/production/index.html">GeoServer documentation</a> 
to see which tomcat versions are supported.</p>
<h3 id="building-on-windows">Building on Windows</h3>
<p>These instructions detail the recommended process for reliably building this on Windows.</p>
<p>Prerequisites - You will need to have this software preinstalled on the system being used to build the Geoserver image:</p>
<ul>
<li>Docker Desktop with WSL2</li>
<li><a href="https://jdk.java.net/">Java JDK</a></li>
<li><a href="https://conda.io/">Conda</a></li>
<li>GDAL (Install with Conda)</li>
</ul>
<p>Add the conda-forge channel to your conda installation:</p>
<pre><code class="language-pwsh">conda config --add channels conda-forge
</code></pre>
<p>Now create a new conda environment with GDAL, installed from conda. Ensure that this environment is active when running
the docker build, e.g.</p>
<pre><code class="language-pwsh">conda create -n geoserver-build -c conda-forge python gdal
conda activate geoserver-build
</code></pre>
<p>Modify the <code>.env</code> with the appropriate environment variables. It is recommended that shortpaths (without whitespace) 
are used with forward slashes to prevent errors. You can get the current java command short path with powershell:</p>
<pre><code class="language-pwsh">(New-Object -ComObject Scripting.FileSystemObject).GetFile((get-command java).Source).ShortPath
</code></pre>
<p>Running the above command should yield a path similar to <code>C:/PROGRA~1/Java/JDK-15~1.2/bin/java.exe</code>, which can be 
assigned to <code>JAVA_HOME</code> in the environment confoguration file.</p>
<p>Then run the docker build commands. If you encounter issues, you may want to ensure that you try to build the image 
without the cache and then run docker up separately:</p>
<pre><code class="language-pwsh">docker-compose -f docker-compose-build.yml build --force-rm --no-cache
docker-compose -f docker-compose-build.yml up -d
</code></pre>





                
              </article>
            </div>
          
          
        </div>
        
      </main>
      
        <footer class="md-footer">
  
  <div class="md-footer-meta md-typeset">
    <div class="md-footer-meta__inner md-grid">
      <div class="md-copyright">
  
  
    Made with
    <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
      Material for MkDocs
    </a>
  
</div>
      
    </div>
  </div>
</footer>
      
    </div>
    <div class="md-dialog" data-md-component="dialog">
      <div class="md-dialog__inner md-typeset"></div>
    </div>
    
    <script id="__config" type="application/json">{"base": "..", "features": ["content.code.copy"], "search": "../assets/javascripts/workers/search.db81ec45.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
    
    
      <script src="../assets/javascripts/bundle.a00a7c5e.min.js"></script>
      
    
  </body>
</html>